/**
 * Generali Solutions d'assurances - Tous droits réservés &copy; 2007 - 2010
 */
package fr.generali.accueilclient.client.assembler.input;

import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.lang.StringUtils;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;

import fr.generali.accueilclient.client.om.IContact;
import fr.generali.accueilclient.client.om.IPersonne;
import fr.generali.accueilclient.client.om.IPieceIdentite;
import fr.generali.refservcommuns.rce.gestiondocument.commundocument.dossierdocument.DtoDossierDocument;
import fr.generali.refservcommuns.rce.gestiondocument.dtogestiondocument.DtoDossierP15;
import fr.generali.refservcommuns.rce.gestiondocument.dtogestiondocument.DtoListeDossierP15;
import fr.generali.refservcommuns.rce.gestiondocument.gestiondocumentservice.GestionDocument;
import fr.generali.refservcommuns.clients.prima.DateRange;
import fr.generali.refservcommuns.rce.gestiondocument.dct.DtoCarteIdentite;
import fr.generali.refservcommuns.rce.gestiondocument.dct.DtoIdentifiantSecuriteSociale;
import fr.generali.refservcommuns.rce.gestiondocument.dct.DtoPasseport;
import fr.generali.refservcommuns.rce.gestiondocument.dct.DtoPermisConduire;
import fr.generali.refservcommuns.rce.gestiondocument.dct.DtoPieceIdentite;

/**
 * @author selrhazala
 */
@Component("contactToGestionDocumentConverter")
public class ContactToGestionDocumentConverter implements Converter<IContact, GestionDocument> {

    /**
     * Code mail personnel
     */
    private static final String CARTE_IDENTITE = "01";
    
    /**
     * Code mail personnel
     */
    private static final String PERMIS_CONDUIRE = "02";
    
    /**
     * Code mail personnel
     */
    private static final String PASSEPORT = "03";
    
    /**
     * Code mail personnel
     */
    private static final String CARTE_SECU = "04";
    
    /**
     * Code mail personnel
     */
    private static final String PERMIS_BATEAU = "05";
    
    /**
     * Code mail personnel
     */
    private static final String TITRE_SEJOUR = "06";
    
    /**
     * {@inheritDoc}
     */
    public GestionDocument convert(IContact input) {
        GestionDocument gestionDocument = null;
        if (input != null) {
            IPersonne client = input.getClient();
            DtoDossierP15 dtoDossierP15 = new DtoDossierP15();

            if (input.getPieceIdentite() != null) {
                IPieceIdentite pieceIdentite = input.getPieceIdentite();
                
                if (dtoDossierP15.getDossierDocument() == null) {
                    dtoDossierP15.setDossierDocument(new DtoDossierDocument());
                }
                
                if (pieceIdentite.getType().equals(CARTE_SECU)) {
                    DtoIdentifiantSecuriteSociale dtoIdSecuriteSociale = new DtoIdentifiantSecuriteSociale();
                    dtoIdSecuriteSociale.setNumeroSS(pieceIdentite.getNumero());
                    
                    if (pieceIdentite.getDateFinValidite() != null) {
                        try {
                            DateRange dateRange = new DateRange();
                            GregorianCalendar gCalendar3 = new GregorianCalendar();
                            gCalendar3.setTime(pieceIdentite.getDateFinValidite());
                            XMLGregorianCalendar dateValidite = 
                                DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar3);
                            dateRange.setEndDate(dateValidite);
                            dtoIdSecuriteSociale.setDateValidite(dateRange);
                        } catch (DatatypeConfigurationException e) {
                            // TODO Auto-generated catch block
                            e.getMessage();
                        }
                    }
                    
                    dtoDossierP15.getDossierDocument().setIdentifiantSecuriteSociale(dtoIdSecuriteSociale);
                } else {
                    DtoPieceIdentite dtoPieceIdentite = new DtoPieceIdentite();
                    dtoPieceIdentite.setNumeroOfficiel(pieceIdentite.getNumero());
                    
                    if (pieceIdentite.getType().equals(CARTE_IDENTITE)
                                    || pieceIdentite.getType().equals(TITRE_SEJOUR)) {
                        DtoCarteIdentite dtoCarteIdentite = new DtoCarteIdentite();
                        dtoCarteIdentite.setStatut(pieceIdentite.getStatut());
                        dtoPieceIdentite.setCarteIdentite(dtoCarteIdentite);
                    }
                    
                    if (pieceIdentite.getType().equals(PASSEPORT)) {
                        DtoPasseport dtoPassport = new DtoPasseport();
                        dtoPassport.setStatut(pieceIdentite.getStatut());
                        dtoPieceIdentite.setPassport(dtoPassport);
                    }
                    
                    if (pieceIdentite.getType().equals(PERMIS_CONDUIRE)
                                    || pieceIdentite.getType().equals(PERMIS_BATEAU)) {
                        DtoPermisConduire dtoPermisConduire = new DtoPermisConduire();
                        dtoPermisConduire.setStatut(pieceIdentite.getStatut());
                        dtoPermisConduire.setCategorie(pieceIdentite.getCategorie());
                        dtoPieceIdentite.setPermisConduire(dtoPermisConduire);
                    } else {
                        if (pieceIdentite.getDateFinValidite() != null) {
                            try {
                                DateRange dateRangeFinValidite = new DateRange();
                                GregorianCalendar gCalendar3 = new GregorianCalendar();
                                gCalendar3.setTime(pieceIdentite.getDateFinValidite());
                                XMLGregorianCalendar dateValidite = 
                                    DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar3);
                                dateRangeFinValidite.setEndDate(dateValidite);
                                dtoPieceIdentite.setPeriodeValidite(dateRangeFinValidite);
                            } catch (DatatypeConfigurationException e) {
                                // TODO Auto-generated catch block
                                e.getMessage();
                            }
                        }
                    }
                    
                    if (pieceIdentite.getDateDelivrance() != null) {
                        try {
                            GregorianCalendar gCalendar1 = new GregorianCalendar();
                            gCalendar1.setTime(pieceIdentite.getDateDelivrance());
                            dtoPieceIdentite.setDateDelivrance(
                                            DatatypeFactory.newInstance().newXMLGregorianCalendar(gCalendar1));
                        } catch (DatatypeConfigurationException e) {
                            // TODO Auto-generated catch block
                            e.getMessage();
                        }
                        dtoPieceIdentite.setLieuDelivrance(pieceIdentite.getLieuDelivrance());
                    }
                    
                    dtoPieceIdentite.setTypePiece(pieceIdentite.getType());
                    
                    if (StringUtils.isNotEmpty(pieceIdentite.getPaysDelivrance())) {
                        dtoPieceIdentite.setPaysAutoriteDelivrante(pieceIdentite.getPaysDelivrance());
                    }
                    
                    List<DtoPieceIdentite> listePieceIdentite = new ArrayList<DtoPieceIdentite>();
                    listePieceIdentite.add(dtoPieceIdentite);
                    
                    dtoDossierP15.getDossierDocument().getPieceIdentite().addAll(listePieceIdentite);
                }
            }
            
            dtoDossierP15.setCodeUser("");
            dtoDossierP15.setIdentifiantPersonne(client.getNumeroClient());
            
            DtoListeDossierP15 dtoListeDossierP15 = new DtoListeDossierP15();
            List<DtoDossierP15> listeDtoDossierP15 = new ArrayList<DtoDossierP15>();
            listeDtoDossierP15.add(dtoDossierP15);
            dtoListeDossierP15.getDossierP15().addAll(listeDtoDossierP15);
            gestionDocument = new GestionDocument();
            gestionDocument.setDtoListeDossierP15(dtoListeDossierP15);
        }

        return gestionDocument;
    }
}
